热修复框架

chengzhenyu 8 gadi atpakaļ
vecāks
revīzija
f4c7901669

+ 17 - 0
app/build.gradle

@@ -86,3 +86,20 @@ dependencies {
86 86
     compile files('libs/jcc-bate-0.7.3.jar')
87 87
     compile 'com.umeng.analytics:analytics:latest.integration'
88 88
 }
89
+buildscript {
90
+    repositories {
91
+        jcenter()
92
+        maven {
93
+            url uri('..\\repo')
94
+        }
95
+    }
96
+    dependencies {
97
+        //group:module:version
98
+        classpath 'com.android.plugin.hotpatch:hotpatch:1.0.0'
99
+    }
100
+}
101
+apply plugin: 'plugin.hotpatch'
102
+
103
+hotpatch{
104
+    includePackageDir='ai\\pai\\lensman'
105
+}

BIN
app/libs/hotpatch_framework.jar


+ 9 - 1
app/proguard-rules.pro

@@ -94,4 +94,12 @@ public static final int *;
94 94
 -keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
95 95
 -keep class com.tencent.mm.sdk.** {
96 96
    *;
97
-}
97
+}
98
+-keepclassmembers class *{
99
+    public static com.android.hotpatch.framework.ChangeQuickRedirect changeQuickRedirect;
100
+}
101
+-keepclassmembers class * {
102
+   public java.lang.Object accessSuper(java.lang.Object,int,java.lang.Object[]);
103
+}
104
+-keep class com.android.hotpatch.**{*;}
105
+-keep class ai.pai.lensman.patch.**{*;}

+ 6 - 0
app/src/main/java/ai/pai/lensman/app.java

@@ -11,7 +11,11 @@ import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
11 11
 import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
12 12
 import com.nostra13.universalimageloader.utils.StorageUtils;
13 13
 
14
+import java.io.File;
15
+
14 16
 import ai.pai.lensman.utils.Constants;
17
+import ai.pai.lensman.utils.PatchManager;
18
+import ai.pai.lensman.utils.UrlContainer;
15 19
 
16 20
 public class App extends Application {
17 21
 
@@ -26,6 +30,8 @@ public class App extends Application {
26 30
         super.onCreate();
27 31
         initImageLoader();
28 32
         mInstance = this.getApplicationContext();
33
+        new PatchManager().patch(this, UrlContainer.PATCH_CONFIG_URL,Constants.APP_PATCH_DIR+ File.separator+"patch-"+BuildConfig.VERSION_NAME+".dex","ai.pai.lensman.patch.PatchesInfoImpl");
34
+
29 35
     }
30 36
 
31 37
 

+ 9 - 0
app/src/main/java/ai/pai/lensman/db/Preferences.java

@@ -79,6 +79,15 @@ public class Preferences {
79 79
         mPrefs.edit().putString("currentSession",currentSession).commit();
80 80
     }
81 81
 
82
+
83
+    public void setPatchUrl(String patchUrl){
84
+        mPrefs.edit().putString("patchUrl",patchUrl).commit();
85
+    }
86
+
87
+    public String getPatchUrl(){
88
+        return mPrefs.getString("patchUrl",NullStr);
89
+    }
90
+
82 91
     public void clearPrefs(){
83 92
         mPrefs.edit().clear().commit();
84 93
     }

+ 1 - 0
app/src/main/java/ai/pai/lensman/utils/Constants.java

@@ -12,5 +12,6 @@ public class Constants {
12 12
     public static final String ORIGIN_DIR_NAME                 = "origin";
13 13
     public static final String THUMBNAIL_DIR_NAME              = "thumbnail";
14 14
     public static final String TMP_DIR_NAME              = "tmp";
15
+    public static final String APP_PATCH_DIR                  = APP_ROOT_DIR+"/patch";
15 16
 
16 17
 }

+ 62 - 0
app/src/main/java/ai/pai/lensman/utils/PatchManager.java

@@ -0,0 +1,62 @@
1
+package ai.pai.lensman.utils;
2
+
3
+
4
+import com.android.common.http.HttpUtils;
5
+import com.android.hotpatch.utils.IPatchManager;
6
+
7
+import org.json.JSONObject;
8
+
9
+import java.io.File;
10
+import java.util.HashMap;
11
+
12
+import ai.pai.lensman.BuildConfig;
13
+import ai.pai.lensman.db.Preferences;
14
+
15
+public class PatchManager extends IPatchManager{
16
+
17
+    private String patchUrl;
18
+
19
+    public PatchManager(){
20
+        new File(Constants.APP_PATCH_DIR).mkdirs();
21
+    }
22
+
23
+    @Override
24
+    protected String getPatchFileDownloadUrl(String patchConfigUrl) {
25
+        if(patchConfigUrl.contains("?")){
26
+            patchConfigUrl+="&platform=android";
27
+        }else{
28
+            patchConfigUrl+="?platform=android";
29
+        }
30
+        patchConfigUrl+="&version="+ BuildConfig.VERSION_NAME;
31
+        patchConfigUrl+="&channel="+"guanwang";
32
+        HashMap<String,String> httpParams = new HashMap<>();
33
+        httpParams.put("src","1");
34
+        String jsonStr = HttpUtils.doHttpPost(patchConfigUrl,httpParams);
35
+        try{
36
+            JSONObject response = new JSONObject(jsonStr);
37
+            JSONObject data = response.getJSONObject("data");
38
+            patchUrl = data.getString("patch_url");
39
+            return patchUrl;
40
+        }catch (Exception e){
41
+            e.printStackTrace();
42
+        }
43
+        return null;
44
+    }
45
+
46
+    @Override
47
+    protected boolean isNewPatchFound() {
48
+        if(!Preferences.getInstance().getPatchUrl().equals(patchUrl)){
49
+            new File(patchSavePath).delete();
50
+            return true;
51
+        }
52
+        if(!new File(patchSavePath).exists()){
53
+            return true;
54
+        }
55
+        return false;
56
+    }
57
+
58
+    @Override
59
+    protected void afterPatchSuccess() {
60
+        Preferences.getInstance().setPatchUrl(patchUrl);
61
+    }
62
+}

+ 1 - 1
app/src/main/java/ai/pai/lensman/utils/UrlContainer.java

@@ -67,5 +67,5 @@ public class UrlContainer {
67 67
 
68 68
     public static final String PLATFORM_PRICE_RULES_PAGE_URL = "http://pai.ai/page/price";
69 69
 
70
-
70
+    public static final String PATCH_CONFIG_URL = HOST_URL+"op/patch";
71 71
 }

BIN
repo/com/android/plugin/hotpatch/hotpatch/1.0.0/hotpatch-1.0.0.jar


+ 1 - 0
repo/com/android/plugin/hotpatch/hotpatch/1.0.0/hotpatch-1.0.0.jar.md5

@@ -0,0 +1 @@
1
+04cbb405b312665f00431c8336b47edc

+ 1 - 0
repo/com/android/plugin/hotpatch/hotpatch/1.0.0/hotpatch-1.0.0.jar.sha1

@@ -0,0 +1 @@
1
+b621d002b8c17885daff42fd81164384aba7a7fc

+ 22 - 0
repo/com/android/plugin/hotpatch/hotpatch/1.0.0/hotpatch-1.0.0.pom

@@ -0,0 +1,22 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
3
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4
+  <modelVersion>4.0.0</modelVersion>
5
+  <groupId>com.android.plugin.hotpatch</groupId>
6
+  <artifactId>hotpatch</artifactId>
7
+  <version>1.0.0</version>
8
+  <dependencies>
9
+    <dependency>
10
+      <groupId>com.android.tools.build</groupId>
11
+      <artifactId>gradle</artifactId>
12
+      <version>2.2.3</version>
13
+      <scope>compile</scope>
14
+    </dependency>
15
+    <dependency>
16
+      <groupId>org.javassist</groupId>
17
+      <artifactId>javassist</artifactId>
18
+      <version>3.22.0-CR1</version>
19
+      <scope>compile</scope>
20
+    </dependency>
21
+  </dependencies>
22
+</project>

+ 1 - 0
repo/com/android/plugin/hotpatch/hotpatch/1.0.0/hotpatch-1.0.0.pom.md5

@@ -0,0 +1 @@
1
+640d4ea0944d59a7d903ec7f0bfeee75

+ 1 - 0
repo/com/android/plugin/hotpatch/hotpatch/1.0.0/hotpatch-1.0.0.pom.sha1

@@ -0,0 +1 @@
1
+cfddca111bee94e07609aa18512e0fcf2a3f856c

+ 12 - 0
repo/com/android/plugin/hotpatch/hotpatch/maven-metadata.xml

@@ -0,0 +1,12 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<metadata>
3
+  <groupId>com.android.plugin.hotpatch</groupId>
4
+  <artifactId>hotpatch</artifactId>
5
+  <versioning>
6
+    <release>1.0.0</release>
7
+    <versions>
8
+      <version>1.0.0</version>
9
+    </versions>
10
+    <lastUpdated>20170303105421</lastUpdated>
11
+  </versioning>
12
+</metadata>

+ 1 - 0
repo/com/android/plugin/hotpatch/hotpatch/maven-metadata.xml.md5

@@ -0,0 +1 @@
1
+89037efcccecda6a668c32743755b699

+ 1 - 0
repo/com/android/plugin/hotpatch/hotpatch/maven-metadata.xml.sha1

@@ -0,0 +1 @@
1
+93d08fd1b04f250f96c8acf7390f14028d49ec06